Skip to content

Conversation

@Joaolpridolficarvalho
Copy link
Contributor

Adiciona testes

…imitivas de Vetor, aumentando a cobertura desses para 100%
…o, números pequenos e grandes, além de configurações de casas decimais
…s de Texto, incluindo formatação, aparar, partição, divisão e manipulação de texto.
…incluindo aleatorio_entre, aleatorio, algum, arredondar, encontrar, filtrar_por, e outros, aumentando a cobertura de testes.
…alores, remoção e verificação de existência, além de testes para formatação de números com diferentes casos.

Atualiza documentação da primitivas de dicionário
…s lógicas, atribuições por índice, acesso a propriedades, e manipulação de variáveis, melhorando a cobertura de testes.
…t.ts, analisador-semantico.test.ts e formatador-delegua
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR (“850”) foca em aumentar a cobertura de testes do dialeto Pituguês e de primitivas/formatadores, além de ajustar a documentação/assinatura da primitiva de dicionário relacionada a conter chave.

Changes:

  • Adiciona uma grande quantidade de testes para primitivas (texto/número/vetor/tupla) e biblioteca global do Pituguês.
  • Expande testes do interpretador Pituguês (com e sem depuração), formatadores e analisador semântico.
  • Ajusta assinatura/documentação de contem/contém em primitivas de dicionário para o formato “infix”.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
testes/primitivas/primitivas-texto.test.ts Novos testes de primitivas de texto (inclui casos adicionais e testes com optional chaining).
testes/primitivas/primitivas-numero.test.ts Casos adicionais para formatar().
testes/interpretador/dialetos/pitugues/interpretador-pitugues.test.ts Testes adicionais para primitivas de dicionário e formatar() em números.
testes/interpretador/dialetos/pitugues/interpretador-pitugues-com-depuracao.test.ts Novos testes focados em depuração e acesso/atribuição por índice.
testes/formatadores/formatador-pitugues.test.ts Amplia cobertura do formatador Pituguês com diversos cenários.
testes/formatadores/formatador-delegua.test.ts Ajustes de formatação + grande bloco de cobertura adicional.
testes/bibliotecas/dialetos/pitugues/primitivas-vetor.test.ts Expande testes de primitivas de vetor (muitos métodos).
testes/bibliotecas/dialetos/pitugues/primitivas-tupla.test.ts Adiciona teste de erro para paraVetor.
testes/bibliotecas/dialetos/pitugues/primitivas-texto.test.ts Expande amplamente testes de primitivas de texto no Pituguês (inclui formatar).
testes/bibliotecas/dialetos/pitugues/biblioteca-global.test.ts Adiciona muitos testes para funções globais (aleatório/algum/filtrar etc.).
testes/analisador-semantico/dialetos/pitugues/analisador-semantico.test.ts Expande cenários do analisador semântico e adiciona testes de avaliação constante.
fontes/bibliotecas/dialetos/pitugues/primitivas-dicionario.ts Ajusta assinatura/documentação de contem/contém para forma “infix”.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +55 to +59
it('Com casas decimais igual a zero', async () => {
const resultado = await primitivasNumero.formatar.implementacao(interpretador, 1234.56, 0);
expect(resultado).toStrictEqual('1.234,56');
});

Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Este teste chama primitivasNumero.formatar(..., 0) passando um número onde a API espera um dicionário de opções. Como 0 é falsy, o teste acaba exercitando o comportamento padrão (2 casas) e não valida “casas decimais = 0”. Troque para um cenário válido (ex.: { casasDecimais: 0 }) ou remova o teste se a API não aceitar número como terceiro parâmetro.

Suggested change
it('Com casas decimais igual a zero', async () => {
const resultado = await primitivasNumero.formatar.implementacao(interpretador, 1234.56, 0);
expect(resultado).toStrictEqual('1.234,56');
});

Copilot uses AI. Check for mistakes.
Comment on lines +220 to +300
describe('encontrar_ultimo', () => {
it('deve retornar o índice da última ocorrência', async () => {
const texto = "Mi casa, su casa.";
const subtexto = "casa";
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto
);
if (resultado !== undefined) {
expect(resultado).toBe(12);
}
});

it('deve retornar -1 quando o subtexto não é encontrado', async () => {
const texto = "Mi casa, su casa.";
const subtexto = "nada";
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto
);
if (resultado !== undefined) {
expect(resultado).toBe(-1);
}
});

it('deve retornar o índice da primeira ocorrência quando há apenas uma', async () => {
const texto = "Olá mundo";
const subtexto = "Olá";
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto
);
if (resultado !== undefined) {
expect(resultado).toBe(0);
}
});
it('deve retornar o índice correto passando o índice inicial', async () => {
const texto = "abc def abc ghi abc";
const subtexto = "abc";
const indiceInicial = 10;
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto,
indiceInicial
);
if (resultado !== undefined) {
expect(resultado).toBe(16);
}
})
it('deve retornar o índice correto quando o índice inicial é negativo', async () => {
const texto = "abc def abc ghi abc";
const subtexto = "abc";
const indiceInicial = -5;
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto,
indiceInicial
);
if (resultado !== undefined) {
expect(resultado).toBe(16);
}
});
it('deve retornar -1 quando o índice inicial é maior que o tamanho do texto', async () => {
const texto = "abc def abc ghi abc";
const subtexto = "abc";
const indiceInicial = 100;
const resultado = await primitivasTexto.encontrar_ultimo?.implementacao?.(
interpretador,
texto,
subtexto,
indiceInicial
);
if (resultado !== undefined) {
expect(resultado).toBe(-1);
}
})
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Os novos testes de encontrar_ultimo/inverter usam optional chaining (?.) + if (resultado !== undefined); isso faz o teste passar mesmo se a primitiva não existir/for undefined, reduzindo a utilidade da suíte. Como inverter existe neste dialeto e encontrar_ultimo aparentemente não (no módulo de primitivas de texto), o ideal é: (1) remover o ?. e falhar se a primitiva deveria existir; ou (2) trocar para it.skip/condicional explícita que valide a existência antes de testar, deixando claro o contrato.

Copilot uses AI. Check for mistakes.
Comment on lines 93 to 142
it('visitarExpressaoAcessoIndiceVariavel com TuplaN válida', async () => {

const lit1 = new Literal(1, 1, 'valor1', 'texto');
const lit2 = new Literal(1, 2, 'valor2', 'texto');
const tupla = new TuplaN(1, 6);

jest.spyOn(interpretador, 'avaliar')
.mockResolvedValueOnce(tupla)
.mockResolvedValueOnce(0);

jest.spyOn(interpretador, 'resolverValor')
.mockReturnValueOnce(tupla)
.mockReturnValueOnce(0);


const expressao = {
linha: 1,
paraTexto: () => '<expressao>',
entidade: tupla,
indice: 0
} as any as AcessoIndiceVariavel;
const resultado = await interpretador.visitarExpressaoAcessoIndiceVariavel(expressao);
expect(resultado).toBe('valor1');
});

it('visitarExpressaoAcessoIndiceVariavel com índice inválido (não inteiro)', async () => {


const tupla = new TuplaN(1, [new Literal(1, 1, 'x', 'texto')]);

jest.spyOn(interpretador, 'avaliar')
.mockResolvedValueOnce(tupla)
.mockResolvedValueOnce(1.5);

jest.spyOn(interpretador, 'resolverValor')
.mockReturnValueOnce(tupla)
.mockReturnValueOnce(1.5);

const entidade = { linha: 1, paraTexto: () => '<e>' } as any;
const indice = { linha: 1, paraTexto: () => '<i>' } as any;
const simbolo = { lexema: ']', linha: 1 } as any;
const expressao = new AcessoIndiceVariavel(1, entidade, indice, simbolo);

await expect(interpretador.visitarExpressaoAcessoIndiceVariavel(expressao)).rejects.toThrow('Índice deve ser inteiro.');
});

it('visitarExpressaoAcessoIndiceVariavel com índice fora do intervalo', async () => {

const tupla = new TuplaN(1, [new Literal(1, 1, 'x', 'texto')]);

Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Os testes adicionados para visitarExpressaoAcessoIndiceVariavel constroem TuplaN com assinatura incorreta (new TuplaN(1, 6) / new TuplaN(1, [ ... ])), deixando elementos como undefined. O método em produção acessa objetoResolvido.elementos.length e vai falhar em runtime. Crie a tupla com (hashArquivo, linha, elementos) e use os Literal criados no array de elementos para validar o retorno.

Copilot uses AI. Check for mistakes.
Comment on lines +169 to +170
const simbolo = { lexema: ']', linha: 1 } as any;
const expressao = new AtribuicaoPorIndice(1, objeto, indice, valor, simbolo);
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O teste de visitarExpressaoAtribuicaoPorIndice instancia AtribuicaoPorIndice com argumentos fora da ordem esperada (o construto recebe (hashArquivo, linha, objeto, indice, valor), mas o teste passa (hashArquivo, objeto, indice, valor, simbolo)). Isso pode mascarar bugs porque expressao.objeto/indice/valor ficam inconsistentes. Ajuste a chamada para a assinatura correta e remova o argumento simbolo (não faz parte do construto).

Suggested change
const simbolo = { lexema: ']', linha: 1 } as any;
const expressao = new AtribuicaoPorIndice(1, objeto, indice, valor, simbolo);
const expressao = new AtribuicaoPorIndice(1, 1, objeto, indice, valor);

Copilot uses AI. Check for mistakes.
Comment on lines 653 to +663
});

describe('aleatorio', () => {
it('retorna número entre 0 e 1', async () => {
const interpretador = criarInterpretadorMock();
const resultado = await aleatorio(interpretador as any);
expect(typeof resultado).toBe('number');
expect(resultado).toBeGreaterThanOrEqual(0);
expect(resultado).toBeLessThanOrEqual(1);
});
});
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A partir do fechamento do describe('biblioteca-global (pituguês)'), vários novos describe(...) foram adicionados fora do bloco principal (o que inclusive aparece pela indentação). Isso não quebra a execução, mas torna a organização do arquivo confusa e pode causar futuros problemas se alguém adicionar hooks (beforeEach/afterEach) no describe principal esperando cobrir todos os testes. Mova esses novos blocos para dentro do describe('biblioteca-global (pituguês)').

Copilot uses AI. Check for mistakes.
Comment on lines 4 to 32
const contem_comum = (nome: string) => {
return {
tipoRetorno: 'lógico',
argumentos: [
new InformacaoElementoSintatico(
'chave',
'qualquer',
true,
[],
'O elemento como chave do dicionário.'
),
],
implementacao: (
interpretador: InterpretadorInterface,
valor: object,
chave: any
): Promise<boolean> => Promise.resolve(chave in valor),
assinaturaFormato: `dicionário.${nome}(chave: qualquer)`,
assinaturaFormato: `dicionário contem(chave: qualquer)`,
documentacao:
`# \`dicionário.${nome}(chave)\`\n\n` +
`# \`dicionário contem(chave)\`\n\n` +
'Retorna verdadeiro se o elemento passado como parâmetro existe como chave do dicionário. Devolve falso em caso contrário.\n' +
'\n\n ## Exemplo de Código\n' +
'\n\n```pitugues\n' +
'var d = {"a": 1, "b": 2, "c": 3}\n' +
`escreva(d.${nome}("a")) // verdadeiro\n` +
`escreva(d.${nome}("f")) // falso\n\`\`\`` +
`escreva(d contem "a") // verdadeiro\n` +
`escreva(d contem "f") // falso\n\`\`\`` +
'\n\n## Formas de uso\n',
exemploCodigo: 'dicionário.contem("minhaChave")',
exemploCodigo: 'dicionário contem "minhaChave"',
};
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A factory contem_comum(nome) still receives nome, but assinaturaFormato, documentacao and exemploCodigo are now hardcoded to contem (sem acento), which makes the contém primitive show the wrong signature/docs and leaves an unused parameter. Use nome to generate the correct spelling (e.g., contem vs contém) and keep the signature/docs aligned with the actual callable form for each primitive.

Copilot uses AI. Check for mistakes.
…com-depuracao.test.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor Author

@Joaolpridolficarvalho Joaolpridolficarvalho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correção

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants